class Contabilita::FattureClienteController < DefaultController
  require_role self.parent_name.underscore
  record_select :search_on => [:numero, :data_fattura], :order_by => :numero, :full_text_search => true 
  
  active_scaffold :fattura_cliente do |config|
    config.label = Application.controller_label(self)
    config.subform.columns = [:name]
    list.sorting = [{:anno => 'DESC'}, {:numero => 'DESC'}]
    config.actions.add :field_search, :config_list, :export

    # definizione colonne
    columns = [ :tipo_fattura, :anno, :numero, :data_fattura, :partner, :nome_partner,
      :totale, :imponibile, :iva, :descrizione, :centri_costo, :data_scadenza,
      :iva_differita, :saldata, :metodo_pagamento, :conto_finanziario, :data_pagamento,
      :note_pagamento, :fattura, :note]
    columns_list = [ :anno, :numero, :data_fattura, :partner, :totale, :descrizione,
      :centri_costo, :data_scadenza, :saldata, :data_pagamento, :file ]
    columns_search = [ :numero, :partner, :data_fattura, :saldata ]
    
    # visualizzazione colonne
    config.columns = config.list.columns = columns + [:file]
    config.show.columns = config.update.columns = config.create.columns = config.field_search.columns = columns
    config.config_list.default_columns = columns_list
    config.field_search.columns = columns_search + columns
    config.field_search.columns.exclude :fattura, :note
    config.columns[:fattura].sort_by :sql => 'fattura_file_name'
    
    # configurazione colonne
    [:partner].each { |i|
      config.columns[i].form_ui = :record_select
      config.columns[i].options = {:multiple => true}
    }
    [:metodo_pagamento, :tipo_fattura, :centri_costo, :conto_finanziario].each { |i|
      config.columns[i].form_ui = :select
      config.columns[i].search_ui = :multi_select
    }
    [:iva_differita, :saldata].each { |i|
      config.columns[i].form_ui = :checkbox
    }
    [:data_fattura, :data_pagamento].each { |i|
      config.columns[i].form_ui = :calendar_date_select
      config.columns[i].options = {:year_range => [6.years.ago, 0.years.from_now]}
    }
    [:data_pagamento, :metodo_pagamento, :note_pagamento, :descrizione, :centri_costo].each { |i|
      config.columns[i].inplace_edit = :ajax
    }
    [:descrizione,:note_pagamento].each { |i|
      config.columns[i].options = NOTE_TEXTAREA
    }
    [:totale, :imponibile, :iva].each { |i|
      config.columns[i].options[:format] = :currency
      config.columns[i].calculate = :sum
    }
    
    # subgroup
    config.columns[:note].collapsed = true
    dati_pagamento = [:saldata, :metodo_pagamento, :conto_finanziario, :data_pagamento, :note_pagamento]
    config.create.columns.add_subgroup "Dati pagamento" do |group|
      group.add(dati_pagamento)
      group.collapsed = true
    end
    config.update.columns.add_subgroup "Dati pagamento" do |group|
      group.add(dati_pagamento)
      #group.collapsed = true
    end
    dettaglio_importo = [:imponibile, :iva]
    config.create.columns.add_subgroup "Dettaglio importo" do |group|
      group.add(dettaglio_importo)
      group.collapsed = true
    end
    config.update.columns.add_subgroup "Dettaglio importo" do |group|
      group.add(dettaglio_importo)
      group.collapsed = true
    end
    
    # azioni
    config.columns[:centri_costo].clear_link
    config.columns[:numero].set_link('show', :inline => true)
    config.columns[:partner].set_link('show', :controller => 'anagrafiche/partners')
    config.action_links.add :inserisci_dati, :label => "(inserisci)", :type => :collection, :inline => true
    config.action_links.add "Note", :action => 'nested', :parameters => {:associations => :note}, :type => :member
  end

  def insolute
    params[:filter] = 'insolute'
    active_scaffold_config.label = Application.controller_label(self) + " (insolute)"
    index
  end

  def scadute
    params[:filter] = 'scadute'
    active_scaffold_config.label = Application.controller_label(self) + " (scadute)"
    index
  end

  def anticipo_fatture
    params[:filter] = 'anticipo_fatture'
    active_scaffold_config.label = Application.controller_label(self) + " (anticipo fatture)"
    index
  end

  def note_credito
    params[:filter] = 'note_credito'
    active_scaffold_config.label = Application.controller_label(self) + " (note di credito)"
    index
  end
  
  def iva_differita
    params[:filter] = 'iva_differita'
    active_scaffold_config.label = Application.controller_label(self) + " (iva differita)"
    index
  end

  def iva_cassa
    params[:filter] = 'iva_cassa'
    active_scaffold_config.label = Application.controller_label(self) + " (iva per cassa)"
    index
  end

  def anno
    params[:filter] = 'anno'
    active_scaffold_config.label = Application.controller_label(self) + " (anno #{params[:anno]})"
    index
  end

  def inserisci_dati
    render(:partial => 'inserisci_dati')
  end
  
  def do_inserisci_dati
    i = params[:input].to_s.split("\t")
    record = FatturaCliente.new
    
    #tipo_fattura = 1
    numero = i[0].to_i
    data_temp = i[1].split("/")
    data_fattura = (data_temp[1] + "/" + data_temp[0] + "/20" + data_temp[2]).to_date
    if Partner.find(:first, :conditions =>  ["ragione_sociale = ?" , i[2]])
      partner_id = Partner.find(:first, :conditions =>  ["ragione_sociale = ?" , i[2]]).id
    else
      partner_id = 0
    end
    nome_partner = i[2].to_s
    imponibile = i[3].split(" ")[1].gsub("\.","").gsub("\,",".").to_f
    iva = i[4].split(" ")[1].gsub("\.","").gsub("\,",".").to_f
    totale = i[5].split(" ")[1].gsub("\.","").gsub("\,",".").to_f
    data_temp = i[6].split("/")
    data_scadenza = (data_temp[1] + "/" + data_temp[0] + "/20" + data_temp[2]).to_date
    #if i.lenght > 6
      tipo_fattura = i[7].to_i
      case tipo_fattura
        when 0
          tipo_fattura = 1
        when 1
          iva_differita = 1
          tipo_fattura = 3
        when 2
          tipo_fattura = 2
        when 3
          tipo_fattura = 4
        else
          tipo_fattura = 1
      end
    #end

    
    record.attributes = {
      :anno => data_fattura.year,
      :partner_id => partner_id,
      :nome_partner => nome_partner,
      :data_fattura => data_fattura,
      :numero => numero,
      :descrizione => "",
      :imponibile => imponibile,
      :iva => iva,
      :totale => totale,
      :data_scadenza => data_scadenza,
      :iva_differita => iva_differita,
      :tipo_fattura_id => tipo_fattura,
      :saldata => 0
    }

    if partner_id != 0
      if record.save!
        flash[:info] = "Fattura n. " + numero.to_s + " del " + data_fattura.to_date.to_s + " inserita correttamente"
        redirect_to :action => :index and return
      else
        redirect_to inserisci_dati_path
        flash[:info] = "Si sono verificati degli errori durante il salvataggio dei dati."
      end
    else
      if record.save_without_validation!
        flash[:info] = "Fattura n. " + numero.to_s + " del " + data_fattura.to_date.to_s + " inserita senza nome cliente"
        redirect_to :action => :index and return
      else
        redirect_to inserisci_dati_path
        flash[:info] = "Si sono verificati degli errori durante il salvataggio dei dati."
      end
    end
    
    rescue NoMethodError
    redirect_to :action => :index
    flash[:info] = "Formato dei dati inseriti non corretto, operazione annullata."
    
    rescue ActiveRecord::RecordInvalid
    redirect_to :action => :index
    flash[:info] = "Si sono verificati degli errori durante il salvataggio dei dati."
  end
  
  protected
  
  def set_conditions
    case params[:filter]
    when 'insolute'
      ['saldata IS NULL or saldata = 0']
    when 'anticipo_fatture'
      ['fatture_cliente.metodo_pagamento_id = 6']
    when 'note_credito'
      ['fatture_cliente.tipo_fattura_id = 2']
    when 'iva_differita'
      ['fatture_cliente.tipo_fattura_id = 3 OR fatture_cliente.iva_differita = 1']
    when 'iva_cassa'
      ['fatture_cliente.tipo_fattura_id = 4']
    when 'anno'
      ['fatture_cliente.anno = ?', params[:anno]]
    when 'partner'
      ['fatture_cliente.partner_id = ?', params[:partner]]
    when 'scadute'
      ['data_scadenza < ? AND (saldata IS NULL or saldata = 0)', Date.today]
    else
      []
    end
  end

  def conditions_for_collection
    set_conditions
  end

  def record_select_conditions_from_controller
    set_conditions
  end
end
